package com.itheima.springbootwebtlias.service.Impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.springbootwebtlias.anno.LogOperation;
import com.itheima.springbootwebtlias.exception.PasswordErrorException;
import com.itheima.springbootwebtlias.exception.UsernameNotExistException;
import com.itheima.springbootwebtlias.mapper.EmpExprMapper;
import com.itheima.springbootwebtlias.mapper.EmpLogMapper;
import com.itheima.springbootwebtlias.mapper.EmpMapper;
import com.itheima.springbootwebtlias.pojo.*;
import com.itheima.springbootwebtlias.service.EmpService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

@Slf4j
@Service
public class EmpServiceImpl implements EmpService {

    @Autowired
    private EmpMapper empMapper;

    @Autowired
    private EmpExprMapper empExprMapper;

    @Autowired
    private EmpLogMapper empLogMapper;

    @Override
    public PageResult page(EmpQueryParam queryParam) {
        //1.分页插件查询
        //1.1启动
        //                              页码            每页展示记录数（多少条）
        PageHelper.startPage(queryParam.getPage() ,queryParam.getPageSize());

        //1.2 调用被分页插件强化的持久层方法
        Page<Emp> page = (Page<Emp>) empMapper.selectbyCondition(queryParam);

        //1.3 从分页插件增强的的方法的返回结果中，获取数据数据封装到PageResult返回

        PageResult pageResult = new PageResult(page.getTotal(), page.getResult());



        return pageResult;
    }

    @LogOperation
    @Transactional(rollbackFor = Exception.class)
    @Override
    public void addEmp(Emp emp) {
        try {
            //1.调用持久层mapper，向员工表添加员工信息
            //2.补充基础数据createtime、updatatime

            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            empMapper.insert(emp);
//        int a =  10 /0;

//            if(true){
//                throw new Exception();
//            }
            //工作经历信息
            //调用持久层方法，向工作经历表添加工作经历信息

            List<EmpExpr> exprList = emp.getExprList();
            if(exprList != null && exprList.size() > 0){
                exprList.stream()
                                .forEach(e -> e.setEmpId(emp.getId()));
                empExprMapper.insetS(exprList);
            }

        } catch (Exception e) {
            throw new RuntimeException(e);

        } finally {
            EmpLog emplog = new EmpLog(emp.getId(),LocalDateTime.now(),"添加员工" + emp.getName());
            empLogMapper.insert(emplog);
        }
    }


    @Override
    public List<Emp> selectEmp() {
        List<Emp> list =  empMapper.selectEmp();
        return list;
    }

    //删除员工、员工工作经历
    @LogOperation
    @Transactional
    @Override
    public void removeEmp(List<Integer> ids) {

        //持久层empmapper
        empMapper.removeEmp(ids);
        //持久层empexprmapper
        empExprMapper.removeEmpExpr(ids);
    }

    @Override
    public Emp queryByIdEmp(Integer id) {
        //查询员工表
        Emp emp = empMapper.queryByIdEmp(id);

        //查询员工经历表
        List<EmpExpr> empr = empExprMapper.queryByIdEmpExpr(id);

        //组合
        emp.setExprList(empr);
        //封装返回组合结果


        //方案二，联合查询一次到位，数据量大不推荐。


        return emp;
    }


    @LogOperation
    @Transactional
    @Override
    public void updateEmp(Emp emp) {
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.updataEmp(emp);



//        empExprMapper.deleteEmpExpr(emp.getExprList());

        List<Integer> list = new ArrayList<>();
        list.add(emp.getId());
        empExprMapper.removeEmpExpr(list);

        if (emp.getExprList() != null && emp.getExprList().size() > 0){
            emp.getExprList().stream()
                            .forEach(expr -> expr.setEmpId(emp.getId()));

            empExprMapper.insetS(emp.getExprList());

        }


    }

    //员工登录
    @Override
    public Emp checkLogin(Emp emp) {
        //调用持久层，根据用户名查询员工信息
        Emp result = empMapper.selectByUsername(emp.getUsername());

        //判断用户是否存在，不存在走异常处理机制
        if(result == null){

            throw new UsernameNotExistException("用户不存在，请检查输入是否正确");
        }

        //判断密码是否正确，不正确走异常处理机制
        if (!Objects.equals(emp.getPassword(), result.getPassword())){

            throw new PasswordErrorException("密码错误，你没机会了");
        }

        //返回响应结果
        return result;

    }


}
